

_ADPCMEncoder1:
		asl		[step]
		asl		[step]
		mov		[nowpcm],a
		sub		a,[adpcmdata]
		mov		[diff],a			;diff = nowpcm - adpcmdata
		mov		[sign],0
		jnc		_ADPCMEnc_1_LP1		;if (diff > 0) goto _ADPCMEnc_1_LP1
		xor		[diff],255
		inc		[diff]				;if (diff < 0) diff = -diff
		mov		[sign],8
		
_ADPCMEnc_1_LP1:

		mov		a,[diff]
		sub		a,[step]			
		jc		_ADPCMEnc_1_LP2		;if(diff < step)goto _ADPCMEnc_1_LP2
		
		mov		[code],4			;code = 4
		mov		a,[step]
		sub		[diff],a			;diff -= scale	
_ADPCMEnc_1_LP2:
		asr		[step]				;step >>= 1
		
		mov		a,[diff]
		sub		a,[step]			
		jc		_ADPCMEnc_1_LP3		;if(diff < step)goto _ADPCMEnc_1_LP3		

		or		[code],2			;code |= 2
		mov		a,[step]
		sub		[diff],a			;diff -= step
_ADPCMEnc_1_LP3:
		asr		[step]				;step >>= 1
		
		mov		a,[diff]
		sub		a,[step]			
		jc		_ADPCMEnc_1_LP4		;if(diff < step)goto _ADPCMEnc_1_LP4
		
		or		[code],1			;code |= 1
		
_ADPCMEnc_1_LP4:		
		mov		[code],a
		and		a,7
		mov		reg[232],a
		
		mov		a,[scale]
		index	StepTbl
		mov		reg[233],a
		mov		[step],a			;step = StepTbl[scale]
		
		mov		a,reg[234]
		mov		[dlevel],a
		mov		a,reg[235]
		mov		[dlevel+1],a
		
		asr		[dlevel]
		rrc		[dlevel+1]			;dlevel	>>= 1
		
		tst		[code],8
		jz		_ADPCMEnc_1_LP5
		
		mov		a,[dlevel+1]
		sub		[adpcmdata+1],a
		mov		a,[dlevel]
		sbb		[adpcmdata],a
		
		tst		[adpcmdata],128
		jz		_ADPCMEnc_1_LP6
		mov		[adpcmdata],0
		mov		[adpcmdata+1],0
		jmp		_ADPCMEnc_1_LP6
		
_ADPCMEnc_1_LP5:
		mov		a,[dlevel+1]
		add		[adpcmdata+1],a
		mov		a,[dlevel]
		adc		[adpcmdata],a
		
		mov		a,[adpcmdata+1]
		cmp		a,0
		mov		a,[adpcmdata]
		xor		a,0x80
		sbb		a,129
		jc		_ADPCMEnc_1_LP6
		mov		[adpcmdata],0
		mov		[adpcmdata+1],255
		
_ADPCMEnc_1_LP6:
		mov		a,[code]
		and		a,7
		index	scale_change_tbl
		add		[scale],a
		
		cmp		[scale],128
		jc		_ADPCMEnc_1_LP7
		mov		[scale],0
		jmp		_ADPCMEnc_1_LP8
		
_ADPCMEnc_1_LP7:
		cmp		[scale],31
		jc		_ADPCMEnc_1_LP8
		mov		[scale],30
_ADPCMEnc_1_LP8:
		mov		a,[code]
		ret
__end_of_ADPCMEncoder1:

		